import { Controller, Post, Get, Body, Query, Inject } from '@midwayjs/core';
import { LakalaConfig } from '../../config/lakala';
import { LakalaUtils } from '../../utils/lakala';
import { LakalaMerchantService } from '../../service/lakala-merchant';
import { CoolTag, TagTypes } from '@cool-midway/core';
import moment = require('moment');
import { client_id, client_secret } from '../../constant';
import { Context } from '@midwayjs/koa';

/**
 * 拉卡拉商户进件前端控制器
 */
@Controller('/app/lakala/merchant')
export class AppLakalaMerchantController {
  @Inject()
  lakalaMerchantService: LakalaMerchantService;

  @Inject()
  ctx: Context;

  private readonly utils = new LakalaUtils();

  /**
   * 商户进件申请
   */
  @Post('/apply')
  async applyMerchantApi(@Body() body: any) {
    try {
      console.log('开始进件流程开始进件流程开始进件流程开始进件流程');

      const order_no = `${moment().format('YYYYMMDDHHmmss')}${Math.floor(
        Math.random() * 100000000
      )}`;

      const _body = {
        // 是否法人进件
        isLegalPerson: false,
        // 固定
        userNo: 24371029,
        // 固定的
        busiCode: 'WECHAT_PAY',
        // TP_MERCHANT:企业 TP_PERSONAL:⼩微个⼈
        merType: 'TP_PERSONAL',

        // 邮箱
        email: 'wmj541452385@sina.com',
        merRegName: '祥龙游戏室',
        // 不能少于七个中文
        merName: '测试商户测试商户',
        // 去掉省，市区后的详细地址
        merAddr: '白云大道北129号',
        provinceCode: 3900,
        cityCode: 4030,
        countyCode: 4036,
        latitude: 1,
        longtude: 2,
        source: 'H5',
        businessContent: '游戏币',
        larName: '测试商户',
        larIdType: '01',
        larIdCard: '352228198411032513',
        larIdCardStart: '2023-03-07',
        larIdCardEnd: '2043-03-07',
        contactMobile: 17316345409,
        contactName: '陈祥龙',
        openningBankCode: '103403626011',
        openningBankName: '中国农业银行股份有限公司屏南县支行',
        clearingBankCode: '103100000026',
        // 结算省份代码
        settleProvinceCode: '35',
        // 结算省份名称
        settleProvinceName: '福建',
        // 结算城市代码
        settleCityCode: '4036',
        // 结算城市名称
        settleCityName: '屏南县',
        // 结算人银行卡
        accountNo: '6228481548812211172',
        // 结算人账户名称
        accountName: '陈祥龙',
        accountType: '58',
        accountIdCard: '352228198411032513',
        externalNo: 'rtewtqwet',
        // 业务拓展信息
        bizContent: {
          fees: [
            {
              feeCode: 'WECHAT',
              feeValue: 0.38,
            },
            {
              feeCode: 'ALIPAY',
              feeValue: 0.38,
            },
            {
              feeCode: 'CREDIT_CARD',
              feeValue: 0.6,
            },
            {
              feeCode: 'DEBIT_CARD',
              feeValue: 0.5,
              topFee: 20,
            },
          ],
          mcc: '5943',
          termNum: '1',
          activityId: '208',
        },
        // 附件信息结合
        attchments: [
          {
            id: 'merchant/null/20250829160730474122ID_CARD_FRONT.png',
            type: 'BANK_CARD',
          },
          {
            id: 'merchant/null/20250829160730474122ID_CARD_FRONT.png',
            type: 'OTHERS',
          },
          {
            id: 'merchant/null/20250829160730474122ID_CARD_FRONT.png',
            type: 'ID_CARD_FRONT',
          },
          {
            id: 'merchant/null/20250829160730474122ID_CARD_FRONT.png',
            type: 'ID_CARD_BEHIND',
          },
          {
            id: 'merchant/null/20250829160730474122ID_CARD_FRONT.png',
            type: 'SHOP_OUTSIDE_IMG',
          },
          {
            id: 'merchant/null/20250829160730474122ID_CARD_FRONT.png',
            type: 'SHOP_INSIDE_IMG',
          },
        ],
        // 结算类型
        settleType: 'D1',
        settlementType: 'AUTOMATIC',
        // 电子合同编号
        contractNo: '3333',
      };

      // 获取访问令牌
      let tokenResult: any = '';
      try {
        tokenResult = await this.lakalaMerchantService.getAccessToken(
          client_id,
          client_secret
        );

        console.log('tokenResult', tokenResult);
      } catch (error) {
        console.log('获取tokens失败', error);
      }

      if (!tokenResult) {
        return {
          success: false,
          message: '获取访问令牌失败',
        };
      }

      const { ctx } = this;
      const userId = ctx?.user?.id || undefined; // 获取当前用户ID

      // // 提交进件申请
      // const result = await this.lakalaMerchantService.applyMerchant(
      //   _body,
      //   tokenResult,
      //   userId
      // );

      // console.log('进件结果：', result);

      // return {
      //   success: result.success,
      //   message: result.success
      //     ? '商户进件申请提交成功，请等待审核'
      //     : result.error,
      // };
    } catch (error) {
      console.log('error', error);

      // this.utils.logError('商户进件申请失败', error);
      return {
        success: false,
        message: '系统错误，请稍后重试',
      };
    }
  }

  /**
   * 查询商户审核状态
   */
  @Get('/status')
  async queryMerchantStatus(@Query() query: { merchantNo: string }) {
    try {
      const { merchantNo } = query;

      if (!merchantNo) {
        return {
          success: false,
          message: '商户号不能为空',
        };
      }

      // 获取访问令牌
      const appId = process.env.LAKALA_APP_ID;
      const appSecret = process.env.LAKALA_APP_SECRET;

      const tokenResult = await this.lakalaMerchantService.getAccessToken(
        appId,
        appSecret
      );
      if (!tokenResult.success) {
        return {
          success: false,
          message: '获取访问令牌失败：' + tokenResult.error,
        };
      }

      const result = await this.lakalaMerchantService.queryMerchantStatus(
        merchantNo,
        tokenResult.data.accessToken
      );

      return {
        success: result.success,
        message: result.success ? '查询成功' : result.error,
        data: result.data
          ? {
              ...result.data,
              statusText: this.utils.formatStatus(
                result.data.status,
                'merchant'
              ),
            }
          : null,
      };
    } catch (error) {
      this.utils.logError('查询商户状态失败', error);
      return {
        success: false,
        message: '系统错误，请稍后重试',
      };
    }
  }

  /**
   * 合同申请
   */
  @Post('/contract/apply')
  async applyContract(@Body() body: any) {
    try {
      const { contractData } = body;

      if (!contractData) {
        return {
          success: false,
          message: '合同信息不能为空',
        };
      }

      const { ctx } = this;
      const userId = ctx?.user?.id || undefined; // 获取当前用户ID

      const result = await this.lakalaMerchantService.applyContract(
        contractData,
        userId
      );

      // {
      //   "success": {
      //     "code": "000000",
      //     "msg": "成功",
      //     "resp_data": {
      //       "order_no": "2025090221314284906922",
      //       "ec_apply_id": 1015373457196605440,
      //       "result_url": "https://esign.lakala.com/signature/s/nqnxezvaz4us1dqv?rdm=1756819897550"
      //     }
      //   },
      //   "message": "合同申请提交成功"
      // }
      return {
        success: result,
        message: result ? '合同申请提交成功' : result.error,
      };
    } catch (error) {
      this.utils.logError('合同申请失败', error);
      return {
        success: false,
        message: '系统错误，请稍后重试',
      };
    }
  }

  // 合同申请回调
  @CoolTag(TagTypes.IGNORE_TOKEN)
  @Post('/contract/callback')
  async contractCallback(@Body() body: any) {
    console.log('收到合同申请回调=>>>>>', body);

    this.applyMerchantApi(body);

    //     属性	说明	必选	类型	备注
    // version	版本号	M	String(32)	1.0
    // orgId	机构号	M	Integer	合同所属机构号
    // orderNo	请求上送的订单号	M	String(32)
    // ecApplyId	电子签约申请受理编号	M	Long
    // ecNo	电子合同号	M	String(32)	QT20210914000216202
    // ecName	电子合同名称	M	String(32)	特约商户支付服务合作协议V3.1
    // ecStatus	电子合同签署状态	M	String(32)	UNDONE 未完成
    // COMPLETED 已完成

    // 收到合同申请回调=>>>>> {

    //   ecApplyId: 1015373457196605400,
    //   ecName: '特约商户支付服务合作协议V4.1(20250116更新)',
    //   ecNo: 'QY20250902793569281',
    //   ecStatus: 'COMPLETED',
    //   orderNo: '2025090221314284906922',
    //   orgId: 984459,
    //   version: '1.0'
    // }
  }

  /**
   * 查询合同状态
   */
  @Get('/contract/status')
  async queryContractStatus(@Query() query: { contractNo: string }) {
    try {
      const { contractNo } = query;

      if (!contractNo) {
        return {
          success: false,
          message: '合同号不能为空',
        };
      }

      // 获取访问令牌
      const appId = process.env.LAKALA_APP_ID;
      const appSecret = process.env.LAKALA_APP_SECRET;

      const tokenResult = await this.lakalaMerchantService.getAccessToken(
        appId,
        appSecret
      );
      if (!tokenResult.success) {
        return {
          success: false,
          message: '获取访问令牌失败：' + tokenResult.error,
        };
      }

      const result = await this.lakalaMerchantService.queryContractStatus(
        contractNo,
        tokenResult.data.accessToken
      );

      return {
        success: result.success,
        message: result.success ? '查询成功' : result.error,
        data: result.data
          ? {
              ...result.data,
              statusText: this.utils.formatStatus(
                result.data.status,
                'contract'
              ),
            }
          : null,
      };
    } catch (error) {
      this.utils.logError('查询合同状态失败', error);
      return {
        success: false,
        message: '系统错误，请稍后重试',
      };
    }
  }

  /**
   * 文件上传
   */
  @Post('/file/upload')
  async uploadFile(@Body() body: { file: any; fileType: string }) {
    try {
      const { file, fileType } = body;

      if (!file || !fileType) {
        return {
          success: false,
          message: '文件和文件类型不能为空',
        };
      }

      // 验证文件类型
      const fileConfig = LakalaConfig.getFileConfig();
      if (!this.utils.validateFileType(file.name, fileConfig.allowedTypes)) {
        return {
          success: false,
          message: `不支持的文件类型，支持的类型：${fileConfig.allowedTypes.join(
            ', '
          )}`,
        };
      }

      // 验证文件大小
      if (file.size > fileConfig.maxSize) {
        return {
          success: false,
          message: `文件大小超过限制，最大支持${this.utils.formatFileSize(
            fileConfig.maxSize
          )}`,
        };
      }

      // 获取访问令牌
      const appId = process.env.LAKALA_APP_ID;
      const appSecret = process.env.LAKALA_APP_SECRET;

      const tokenResult = await this.lakalaMerchantService.getAccessToken(
        appId,
        appSecret
      );
      if (!tokenResult.success) {
        return {
          success: false,
          message: '获取访问令牌失败：' + tokenResult.error,
        };
      }

      const result = await this.lakalaMerchantService.uploadFile(
        file,
        fileType,
        tokenResult.data.accessToken
      );

      return {
        success: result.success,
        message: result.success ? '文件上传成功' : result.error,
        data: result.data || null,
      };
    } catch (error) {
      this.utils.logError('文件上传失败', error);
      return {
        success: false,
        message: '系统错误，请稍后重试',
      };
    }
  }

  /**
   * 获取配置信息
   */
  @Get('/config')
  async getConfig() {
    try {
      return {
        success: true,
        message: '获取成功',
        data: {
          merchantTypes: Object.keys(LakalaConfig.MERCHANT_TYPES).map(key => ({
            value: LakalaConfig.MERCHANT_TYPES[key],
            label: this.utils.formatMerchantType(
              LakalaConfig.MERCHANT_TYPES[key]
            ),
          })),
          contractTypes: Object.keys(LakalaConfig.CONTRACT_TYPES).map(key => ({
            value: LakalaConfig.CONTRACT_TYPES[key],
            label: this.utils.formatContractType(
              LakalaConfig.CONTRACT_TYPES[key]
            ),
          })),
          signTypes: Object.keys(LakalaConfig.SIGN_TYPES).map(key => ({
            value: LakalaConfig.SIGN_TYPES[key],
            label: key === 'ELECTRONIC' ? '电子签署' : '纸质签署',
          })),
          fileTypes: Object.keys(LakalaConfig.FILE_TYPES).map(key => ({
            value: LakalaConfig.FILE_TYPES[key],
            label: this.getFileTypeLabel(LakalaConfig.FILE_TYPES[key]),
          })),
          fileConfig: LakalaConfig.getFileConfig(),
        },
      };
    } catch (error) {
      this.utils.logError('获取配置失败', error);
      return {
        success: false,
        message: '系统错误，请稍后重试',
      };
    }
  }

  /**
   * 生成商户号
   */
  @Get('/generate/merchant-no')
  async generateMerchantNo() {
    try {
      const merchantNo = this.utils.generateMerchantNo();

      return {
        success: true,
        message: '生成成功',
        data: { merchantNo },
      };
    } catch (error) {
      this.utils.logError('生成商户号失败', error);
      return {
        success: false,
        message: '系统错误，请稍后重试',
      };
    }
  }

  /**
   * 验证商户数据
   */
  private validateMerchantData(data: any): string[] {
    const errors: string[] = [];

    if (!data.merchantName) errors.push('商户名称不能为空');
    if (!data.merchantType) errors.push('商户类型不能为空');
    if (!data.businessLicense) errors.push('营业执照号不能为空');
    if (!data.legalPerson) errors.push('法人姓名不能为空');
    if (!data.contactPhone) errors.push('联系电话不能为空');
    if (!data.contactEmail) errors.push('联系邮箱不能为空');
    if (!data.bankAccount) errors.push('银行账户不能为空');
    if (!data.bankName) errors.push('开户银行不能为空');

    // 格式验证
    if (data.contactPhone && !this.utils.validatePhone(data.contactPhone)) {
      errors.push('联系电话格式不正确');
    }

    if (data.contactEmail && !this.utils.validateEmail(data.contactEmail)) {
      errors.push('联系邮箱格式不正确');
    }

    if (
      data.businessLicense &&
      !this.utils.validateBusinessLicense(data.businessLicense)
    ) {
      errors.push('营业执照号格式不正确');
    }

    if (data.bankAccount && !this.utils.validateBankCard(data.bankAccount)) {
      errors.push('银行账户格式不正确');
    }

    return errors;
  }

  /**
   * 验证合同数据
   */
  private validateContractData(data: any): string[] {
    const errors: string[] = [];

    if (!data.merchantNo) errors.push('商户号不能为空');
    if (!data.contractType) errors.push('合同类型不能为空');
    if (!data.contractTemplate) errors.push('合同模板不能为空');
    if (!data.signType) errors.push('签署类型不能为空');
    if (!data.signerName) errors.push('签署人姓名不能为空');
    if (!data.signerPhone) errors.push('签署人电话不能为空');
    if (!data.signerIdCard) errors.push('签署人身份证号不能为空');

    // 格式验证
    if (data.signerPhone && !this.utils.validatePhone(data.signerPhone)) {
      errors.push('签署人电话格式不正确');
    }

    if (data.signerIdCard && !this.utils.validateIdCard(data.signerIdCard)) {
      errors.push('签署人身份证号格式不正确');
    }

    return errors;
  }

  /**
   * 获取文件类型标签
   */
  private getFileTypeLabel(fileType: string): string {
    const labelMap = {
      [LakalaConfig.FILE_TYPES.BUSINESS_LICENSE]: '营业执照',
      [LakalaConfig.FILE_TYPES.ID_CARD_FRONT]: '身份证正面',
      [LakalaConfig.FILE_TYPES.ID_CARD_BACK]: '身份证背面',
      [LakalaConfig.FILE_TYPES.BANK_PERMIT]: '开户许可证',
      [LakalaConfig.FILE_TYPES.AUTHORIZATION]: '授权书',
      [LakalaConfig.FILE_TYPES.OTHER]: '其他',
    };

    return labelMap[fileType] || fileType;
  }
}
